home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_08 / plauger / isgetffl.c < prev    next >
C/C++ Source or Header  |  1994-06-09  |  2KB  |  60 lines

  1. ---------------- Listing 11: member function _Getffld(char *) ---------
  2.  
  3. // isgetffl -- istream::_Getffld(char *)
  4. #include <ctype.h>
  5. #include <locale.h>
  6. #include <string.h>
  7. #include <istream>
  8. #include "xmath.h"
  9.  
  10. int istream::_Getffld(char ac[MAX_EXP_DIG+MAX_SIG_DIG+16])
  11.     {    // extract a floating field
  12.     char *p, seen;
  13.     int ch, nsig;
  14.     int pten;
  15.     p = ac, ch = rdbuf()->sbumpc();
  16.     pten = 0;
  17.     if (ch == '+' || ch == '-')
  18.         *p++ = ch, ch = rdbuf()->sbumpc();
  19.     for (seen = 0; ch == '0'; ch = rdbuf()->sbumpc(), seen = 1)
  20.         ;    // strip leading zeros
  21.     if (seen)
  22.         *p++ = '0';    // put one back
  23.     for (nsig = 0; isdigit(ch); ch = rdbuf()->sbumpc(), seen = 1)
  24.         if (nsig < MAX_SIG_DIG)
  25.             *p++ = ch, ++nsig;
  26.         else
  27.             ++pten;
  28.     if (ch == localeconv()->decimal_point[0])
  29.         *p++ = ch, ch = rdbuf()->sbumpc();
  30.     if (nsig == 0)
  31.         {    // strip zeros after point
  32.         for (; ch == '0'; ch = rdbuf()->sbumpc(), seen = 1)
  33.             --pten;
  34.         if (pten < 0)
  35.             *p++ = '0', ++pten;    // put one back
  36.         }
  37.     for (; isdigit(ch); ch = rdbuf()->sbumpc(), seen = 1)
  38.         if (nsig < MAX_SIG_DIG)
  39.             *p++ = ch, ++nsig;
  40.     if (seen && (ch == 'e' || ch == 'E'))
  41.         {    // parse exponent
  42.         *p++ = ch, ch = rdbuf()->sbumpc();
  43.         if (ch == '+' || ch == '-')
  44.             *p++ = ch, ch = rdbuf()->sbumpc();
  45.         for (seen = 0; ch == '0'; ch = rdbuf()->sbumpc(), seen = 1)
  46.             ;    // strip leading exponent zeros
  47.         if (seen)
  48.             *p++ = '0';    // put one back
  49.         for (nsig = 0; isdigit(ch); ch = rdbuf()->sbumpc(), seen = 1)
  50.             if (nsig < MAX_EXP_DIG)
  51.                 *p++ = ch, ++nsig;
  52.         }
  53.     if (ch != EOF)
  54.         rdbuf()->sputbackc(ch);
  55.     if (!seen)
  56.         p = ac;
  57.     *p = '\0';
  58.     return (pten);
  59.     }
  60.